package com.liujit.pay.wx.properties;

import cn.hutool.log.LogFactory;
import cn.hutool.setting.dialect.Props;
import lombok.Getter;

import java.io.*;

/**
 * @Description 微信支付配置文件
 * @Author LiuJun
 * @Date 2020/5/25 11:06 上午
 */
@Getter
public class PayProperties implements Serializable {

    /**
     * 应用Id
     */
    private String appId;

    /**
     * 商户号
     */
    private String mchId;

    /**
     * 商户秘钥
     */
    private String mchKey;

    /**
     * 商户证书路径
     */
    private String keyPath;

    /**
     * 商户证书序列号
     */
    private String serialNo;

    /**
     * 必须声明 volatile，在多线程中instance被修改后能立即更新到主内存中 如果不声明，就不是线程安全的
     */
    private volatile static PayProperties INSTANCE = null;

    /**
     * 构造方法私有，不允许通过New创建对象
     */
    private PayProperties() {
        if (INSTANCE != null) {
            throw new RuntimeException("singleton constructor is called... ");
        }
    }

    /**
     * 通过反序列化创建对象，直接返回
     */
    private Object readResolve() {
        return getInstance();
    }

    /**
     * 构造方法私有，不允许通过New创建对象
     */
    private PayProperties(String appId, String mchId, String mchKey, String keyPath, String serialNo) {
        this.appId = appId;
        this.mchId = mchId;
        this.mchKey = mchKey;
        this.keyPath = keyPath;
        this.serialNo = serialNo;
    }

    /**
     * 通过该方法获取实例对象
     *
     * @return
     */
    public static PayProperties getInstance() {
        if (INSTANCE == null) {
            synchronized (PayProperties.class) {
                if (INSTANCE == null) {
                    Props props = new Props("wx-pay.properties");
                    INSTANCE = new PayProperties(props.getProperty("appId"),
                            props.getProperty("mchId"), props.getProperty("mchKey"),
                            props.getProperty("keyPath"), props.getProperty("serialNo"));
                }
            }
        }
        return INSTANCE;
    }
}
